<?php

namespace app\checkin\model;

use think\admin\Model;

/**
 * 系统设置模型（横表结构）
 */
class Setting extends Model
{
    /**
     * 数据表名
     * @var string
     */
    protected $name = 'checkin_setting';

    /**
     * 自动时间戳
     * @var bool
     */
    protected $autoWriteTimestamp = true;

    /**
     * JSON字段
     * @var array
     */
    protected $json = ['time_slots'];

    /**
     * JSON字段编码选项
     * @var array
     */
    protected $jsonAssoc = true;

    /**
     * 字段类型转换
     * @var array
     */
    protected $type = [
        'unit_minutes' => 'integer',
        'unit_points' => 'integer',
        'timeout_minutes' => 'integer',
        'points_expire_days' => 'integer',
        'voice_start' => 'integer',
        'voice_end' => 'integer',
    ];

    /**
     * 获取全局配置（单例模式）
     * @param int $storeId 门店ID，0为全局
     * @return Setting|null
     */
    public static function getConfig(int $storeId = 0)
    {
        $setting = self::where(['store_id' => $storeId])->find();

        // 如果不存在，创建默认配置
        if (!$setting) {
            $setting = self::create([
                'store_id' => $storeId,
                'unit_minutes' => 10,
                'unit_points' => 1,
                'rounding' => 'floor',
                'timeout_minutes' => 0,
                'time_slots' => '',
                'points_expire_days' => 0,
                'voice_start' => 1,
                'voice_end' => 1,
            ]);
        }

        return $setting;
    }

    /**
     * 更新配置
     * @param array $data 配置数据
     * @param int $storeId 门店ID，0为全局
     * @return bool
     */
    public static function updateConfig(array $data, int $storeId = 0)
    {
        // 确保 time_slots 是索引数组而非关联数组
        if (isset($data['time_slots']) && is_array($data['time_slots'])) {
            $data['time_slots'] = array_values($data['time_slots']);
        }

        $setting = self::where(['store_id' => $storeId])->find();

        if ($setting) {
            return $setting->save($data);
        } else {
            $data['store_id'] = $storeId;
            return self::create($data) ? true : false;
        }
    }

    /**
     * 获取单个配置值（兼容旧方法）
     * @param string $key 配置键
     * @param int $storeId 门店ID，0为全局
     * @param mixed $default 默认值
     * @return mixed
     */
    public static function getSetting(string $key, int $storeId = 0, $default = null)
    {
        $setting = self::getConfig($storeId);
        return $setting ? ($setting->$key ?? $default) : $default;
    }

    /**
     * 设置单个配置值（兼容旧方法）
     * @param string $key 配置键
     * @param mixed $value 配置值
     * @param int $storeId 门店ID，0为全局
     * @param string $description 说明（已废弃，保留参数兼容性）
     * @return bool
     */
    public static function setSetting(string $key, $value, int $storeId = 0, string $description = '')
    {
        return self::updateConfig([$key => $value], $storeId);
    }
}

